#ifndef CKERNEL_H
#define CKERNEL_H
#include"INetMediator.h"
#include "mychatdialog.h"
#include <QObject>
#include"packDef.h"
#include"logindialog.h"
#include<QMap>
#include"useritem.h"
#include"chatdialog.h"
#include<windows.h>
#include"groupdialog.h"
//#pragma execution_character_set("UTF-8")
using namespace std;
class CKernel;
//定义函数指针
typedef void (CKernel::*PFUN)(long ISendIp, char* buf, int nLen);

class CKernel : public QObject
{
    Q_OBJECT
public:
    explicit CKernel(QObject *parent = nullptr);
       ~CKernel();

    //QString utf-8 -> char*  gb2312
    static void utf8ToGb2312(QString &utf8,char* gbBuf,int nLen);
    //char*  gb2312 -> QString utf-8
    static QString gb2312ToUtf8(char* gbBuf);

    //初始化协议映射表
    void setProtocalMap();
    //处理注册回复
    void dealRegisterRs(long ISendIp, char* buf, int nLen);
    //处理登录回复
    void dealLoginRs(long ISendIp, char* buf, int nLen);
    //处理好友信息请求(服务端发给我们的请求)
    void dealFriendInfoRq(long ISendIp, char* buf, int nLen);
    //处理服务端发过来的聊天请求
    void dealChatRq(long ISendIp, char* buf, int nLen);
    //处理服务器发过来的群聊内容请求
    void dealGroupMesRq(long ISendIp, char* buf, int nLen);
    //处理服务端发过来的聊天回复
    void dealChatRs(long ISendIp, char* buf, int nLen);
    //处理添加好友请求
    void dealAddFriendRq(long ISendIp,char* buf,int nLen);
    //处理添加好友回复
    void dealAddFriendRs(long ISendIp,char* buf,int nLen);
    //处理添加群聊回复
    void dealAddGroupRs(long ISendIp,char* buf,int nLen);
    //处理群聊的属性请求
    void dealGroupInfoRq(long ISendIp,char* buf,int nLen);
    //处理下线请求
    void dealOfflineRq(long ISendIp,char* buf,int nLen);
    //处理发送文件请求
    void dealSendFileRq(long ISendIp,char* buf,int nLen);
    //处理发送文件回复
    void dealSendFileRs(long lSendIP, char *buf, int nLen);
    //处理发送文件块请求
    void dealFileBlockRq(long lSendIP, char *buf, int nLen);
    //处理群聊邀请成员请求
    void dealGroupInviteRq(long lSendIP, char *buf, int nLen);
    //处理群聊邀请成员回复
    void dealGroupInviteRs(long lSendIP, char *buf, int nLen);
    //处理删除好友请求
    void dealDelFriendRq(long lSendIP, char *buf, int nLen);
    //处理群聊好友信息
    void dealGroupListInfo(long lSendIP, char *buf, int nLen);
signals:

public slots:
    //接受总数据的处理槽函数
    void slot_readyData(long ISendIp, char* buf, int nLen);
    //处理注册信息的槽函数
    void slot_registerCommit(QString name,QString tel,QString password);
    //处理登录信息槽函数
    void slot_loginCommit(QString tel,QString password);
    //处理点击用户头像槽函数
    void slot_userItemClicked(int id);
    //处理点击群聊头像槽函数
    void slot_groupItemClicked(int id);
    //处理用户发送聊天内容的槽函数
    void slot_sendChatMsg(int id,QString content);
    //发送群消息的槽函数
    void slot_sendGroupMsg(int id,QString content);
    //添加好友的处理槽函数
    void slot_addFriend();
    //添加群聊的处理槽函数
    void slot_addGroup();
    //处理关闭登录&注册窗口的信号的槽函数
    void slot_close();
    //关闭好友列表窗口的槽函数
    void slot_offline();
    //处理发送文件信号的槽函数
    void slot_sendFileMsg(int id);
    //处理群聊邀请成员信号的槽函数
    void slot_groupInvite(int id,QString groupname);
    //处理点击退出群聊信号的槽函数
    void slot_exitGroup(int groupId);
    //处理点击删除好友信号的槽函数
    void slot_delFriend(int friendId);
    //处理点击刷新按钮的槽函数
    void slot_groupList(int groupId);
private:
    //保存自己的id
    int m_id;
    //保存自己的昵称
    QString m_name;
    //中介者类对象
    INetMediator* m_pMediator;
    //好友列表界面对象
    MyChatDialog* m_MainWnd;
    //登录&注册界面
    LoginDialog* m_LoginDialog;
    //协议映射表，协议头映射处理函数
    PFUN m_netProtocalMap[_DEF_PROTOCAL_COUNT];
    //管理id->userItem
    QMap<int,UserItem*> m_mapIdToUserItem;
    //管理id ->聊天窗口
    QMap<int,ChatDialog*> m_mapIdToChatdialog;
    //管理id->groupItem
    QMap<int,UserItem*> m_mapIdToGroupItem;
    //管理id ->群聊窗口
    QMap<int,Groupdialog*> m_mapIdToGroupdialog;
    //管理id ->file
    QMap<QString,FileInfo*> m_mapIdToFileInfo;

};

#endif // CKERNEL_H
